home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 February / EnigmA AMIGA RUN 15 (1997)(G.R. Edizioni)(IT)[!][issue 1997-02][PLANET CD V].iso / enigma / earcd / comm / comm5 / nwsbrkr5.lha / Reader / NewsBreaker / src / gui / Dialogs.c < prev    next >
Text File  |  1996-12-14  |  9KB  |  354 lines

  1. /*
  2.  * Dialogs -- verschiedene Dialog-"Requester" für Userinput
  3.  *
  4.  * INPUTS
  5.  *  noch in Arbeit, besser wäre was Flexibles
  6.     mehr BOOPSI , weniger Gadtools-Gadgets.
  7.  *
  8.  *
  9.  * RESULT
  10.  *  wird in STRPTRs geschrieben, heikel wg. Speicher usw.
  11.  *
  12.  */
  13.  
  14. /*
  15.    todo:
  16.    umwandeln der GADTOOLS_ Programmierung in ein BOOPSI GUI
  17.  */
  18.  
  19.  
  20. /* GadgetID's: */
  21.  
  22. #define GAD_TO          44
  23. #define GAD_TOA         45
  24. #define GAD_SUBJ        46
  25.  
  26. #define GAD_SCHREIBEN   66
  27.  
  28. #define MAXCHARS        128    /* maximale Zeichen im S-Gadget, todo */
  29.  
  30. #define NOSELECT ~0
  31. #define BUTTONPRESSED   (NOSELECT - 1)
  32.  
  33. /*
  34. Dialog
  35. ist der Standarddialog, es geht darum vom User Werte abzufragen,
  36. die nicht mit einfachen Buttonklicks oder Menupunkten eingegeben
  37. werden können:
  38.  
  39. - Strings     Namen Mailadressen Gruppennamen
  40. - Zahlen
  41. - Listen
  42.  
  43. Mit dem Parameter type wird die Art des Dialogs gesteuert.
  44. Implementation: in  einem switch/case Konstrukt werden
  45. unterschiedliche Layouts je nach type gezeichnet.
  46.  
  47. IDCMP-Loop wie gehabt.
  48.  
  49. Auswertung der Eingaben.
  50. - Auslesen der Stringgadets von Kopieren der Strings
  51.   an einen Platz, der OK ist: ein buffer (kludge).
  52.   Dann Pointer auf buffer setzen.
  53.  
  54.   Das alles ist sehr wackelig. Hier sind bestimmt noch Fehler.
  55.   Besonders bei den Pointern (mein Spezialgebiet) und bei
  56.   Speicher.
  57.  
  58. Rücksprung in die aufrufende Routine.
  59. */
  60.  
  61.  
  62.  
  63. int
  64. Dialog (STRPTR to, STRPTR toa, STRPTR subj, int type)
  65. {
  66.   int result = NOSELECT;
  67.   struct IntuiMessage *imsg;
  68.  
  69.   struct TextAttr *texatt;
  70.   struct Screen *mysc;
  71.   struct NewGadget ng;
  72.   struct Gadget *glist, *gad, *toGad;
  73.   struct Window *win;
  74.   void *vi;
  75.  
  76.   ULONG imsgClass;
  77.   UWORD imsgCode;
  78.   UWORD topborder, leftborder, rightborder, bottomborder;
  79.   UWORD left, top, height, width;
  80.  
  81.   BOOL going = TRUE;
  82.   BOOL terminated = FALSE;
  83.  
  84.  
  85.  
  86.   mysc = LockPubScreen (NULL);
  87.   if (mysc)
  88.     {
  89.       texatt = mysc->Font;
  90.       vi = GetVisualInfo (mysc, TAG_DONE);
  91.       if (vi)
  92.     {
  93.       /* Default-Windowposition */
  94.  
  95.       width = (mysc->Width) - 200;
  96.       height = (mysc->Height) / 3;
  97.       left = width / 2;
  98.       top = height / 2;
  99.  
  100.       win = OpenWindowTags (NULL,
  101.                 WA_Width, width,
  102.                 WA_InnerHeight, height,
  103.                 WA_Left, left,
  104.                 WA_Top, top,
  105.  
  106.                 WA_Flags, WFLG_DEPTHGADGET |
  107.                 WFLG_DRAGBAR |
  108.                 WFLG_CLOSEGADGET |
  109.                 WFLG_SIZEGADGET |
  110.                 WFLG_SIZEBBOTTOM |
  111.                 WFLG_SIZEBRIGHT,
  112.                 WA_Activate, TRUE,
  113.                 WA_SmartRefresh, TRUE,
  114.                 WA_IDCMP, CLOSEWINDOW |
  115.                 REFRESHWINDOW |
  116.                 LISTVIEWIDCMP |
  117.                 BUTTONIDCMP |
  118.                 IDCMP_NEWSIZE,
  119.                 WA_MinWidth, 200,
  120.                 WA_MinHeight, 80,
  121.                 WA_Title, msgtypeaction[type],
  122.                 TAG_DONE);
  123.  
  124.       if (win)
  125.         {
  126.           /* weil Window offen ist & Screen sperrt, Sperre (lock) weg: */
  127.           UnlockPubScreen (NULL, mysc);
  128.  
  129.           do
  130.         {
  131.           /* todo: Refresh! */
  132.           terminated = FALSE;    /* initialisieren */
  133.           glist = NULL;
  134.           toGad = NULL;
  135.           gad = NULL;
  136.  
  137.           /* Größe des Fensters ermitteln, todo: Prefs */
  138.           left = win->LeftEdge;
  139.           top = win->TopEdge;
  140.           width = win->Width;
  141.           height = win->Height;
  142.  
  143.           /* Rahmen berechnen */
  144.           topborder = mysc->WBorTop + (mysc->Font->ta_YSize + 1);
  145.           leftborder = mysc->WBorLeft + 2;
  146.           rightborder = mysc->WBorRight + 2;
  147.           bottomborder = mysc->WBorBottom + 2;
  148.  
  149.           /* Gadget-Größen bestimmen */
  150.           gad = CreateContext (&glist);
  151.  
  152.           /* Meine Stringgadgets erzeugen */
  153.           ng.ng_GadgetText = "An:";
  154.           ng.ng_LeftEdge = leftborder + 60;
  155.           ng.ng_TopEdge = topborder;
  156.           ng.ng_Width = width - rightborder - leftborder - 16 - ng.ng_LeftEdge;        /* todo */
  157.           ng.ng_Height = win->RPort->TxHeight + 6;
  158.           ng.ng_TextAttr = texatt;
  159.           ng.ng_VisualInfo = vi;
  160.           ng.ng_GadgetID = GAD_TO;
  161.           ng.ng_Flags = 0;
  162.  
  163.           toGad = gad = CreateGadget (STRING_KIND, gad, &ng,
  164.                           GTST_String, to,
  165.                           GTST_MaxChars, MAXCHARS,
  166.                           TAG_DONE);
  167.  
  168.           if ((type == POSTING) || (type == FOLLOWUP))
  169.             {
  170.               ng.ng_GadgetText = "Gruppe:";
  171.             }
  172.           else
  173.             {
  174.               ng.ng_GadgetText = "Adresse:";
  175.             }
  176.  
  177.           ng.ng_TopEdge = ng.ng_TopEdge + ng.ng_Height + 5;
  178.           ng.ng_GadgetID = GAD_TOA;
  179.           ng.ng_Flags = 0;
  180.  
  181.           gad = CreateGadget (STRING_KIND, gad, &ng,
  182.                       GTST_String, toa,
  183.                       GTST_MaxChars, MAXCHARS,
  184.                       TAG_DONE);
  185.  
  186.           ng.ng_TopEdge = ng.ng_TopEdge + ng.ng_Height + 5;
  187.           ng.ng_GadgetText = "Thema: ";
  188.           ng.ng_GadgetID = GAD_SUBJ;
  189.           ng.ng_Flags = 0;
  190.  
  191.           gad = CreateGadget (STRING_KIND, gad, &ng,
  192.                       GTST_String, subj,
  193.                       GTST_MaxChars, MAXCHARS,
  194.                       TAG_DONE);
  195.  
  196.           ng.ng_LeftEdge = leftborder;
  197.           ng.ng_TopEdge = ng.ng_TopEdge + ng.ng_Height + 5;
  198.           ng.ng_GadgetText = " Schreiben ";
  199.           ng.ng_Width = TextLength (win->RPort, ng.ng_GadgetText, strlen (ng.ng_GadgetText));
  200.           ng.ng_GadgetID = GAD_SCHREIBEN;
  201.           ng.ng_Flags = 0;
  202.  
  203.           gad = CreateGadget (BUTTON_KIND, gad, &ng, TAG_DONE);
  204.  
  205.           if (gad)
  206.             {
  207.  
  208.               /* Gadgets dem Fenster hinzufügen ... */
  209.               AddGList (win, glist, -1, -1, NULL);
  210.               RefreshGList (glist, win, NULL, -1);
  211.               GT_RefreshWindow (win, NULL);    /* ... und darstellen */
  212.  
  213.               /* Window-Schleife */
  214.               while (!terminated)
  215.             {
  216.               /* auf IDCMP-Message warten */
  217.               Wait (1 << win->UserPort->mp_SigBit);
  218.               while (!terminated)
  219.                 {
  220.                   if (imsg = GT_GetIMsg (win->UserPort))
  221.                 {
  222.                   imsgClass = imsg->Class;
  223.                   imsgCode = imsg->Code;
  224.  
  225.                   gad = (struct Gadget *) imsg->IAddress;
  226.                   GT_ReplyIMsg (imsg);    /* und Message wieder freigeben */
  227.  
  228.                   switch (imsgClass)
  229.                     {
  230.                     case GADGETUP:
  231.                       {
  232.                     /* welches GADTOOLS-Gadget? */
  233.                     switch (gad->GadgetID)
  234.                       {
  235.                       case GAD_SCHREIBEN:
  236.                         terminated = TRUE;
  237.                         result = BUTTONPRESSED;
  238.                         break;
  239.  
  240.                       case GAD_TO:
  241.                         sprintf (to, "%s", ((struct StringInfo *) gad->SpecialInfo)->Buffer);
  242.                         break;
  243.  
  244.                       case GAD_TOA:
  245.                         sprintf (toa, "%s", ((struct StringInfo *) gad->SpecialInfo)->Buffer);
  246.                         break;
  247.  
  248.                       case GAD_SUBJ:
  249.                         sprintf (subj, "%s", ((struct StringInfo *) gad->SpecialInfo)->Buffer);
  250.                         break;
  251.                       }
  252.  
  253.                     if (terminated)
  254.                       {
  255.                         going = FALSE;    /* kein Refresh zeichnen */
  256.                       }
  257.                     break;
  258.                       }        /* case GADGETUP */
  259.  
  260.                     case CLOSEWINDOW:
  261.                       /* CANCEL -- Verlasse das Fenster ohne Berücksichtigung der Stringgadget-Inhalte */
  262.                       result = NOSELECT;
  263.                       terminated = TRUE;
  264.                       going = FALSE;    /* keine neuen Gadgets */
  265.                       strcpy (to, "");
  266.                       strcpy (toa, "");
  267.                       strcpy (subj, "");
  268.                       RemoveGList (win, glist, -1);
  269.                       break;
  270.  
  271.                     case REFRESHWINDOW:
  272.                       GT_BeginRefresh (win);
  273.                       GT_EndRefresh (win, TRUE);
  274.                       break;
  275.  
  276.                     case IDCMP_NEWSIZE:    /* todo: Refresh! */
  277.                       terminated = TRUE;
  278.                       going = TRUE;
  279.                       RemoveGList (win, glist, -1);
  280.                       SetAPen (win->RPort, 0L);
  281.                       RectFill (win->RPort, win->BorderLeft, win->BorderTop, win->Width - win->BorderRight - 1, win->Height - win->BorderBottom - 1);
  282.                       RefreshWindowFrame (win);
  283.                       FreeGadgets (glist);
  284.                       glist = NULL;
  285.                       break;
  286.                     }    /* switch */
  287.                 }
  288.                 }
  289.             }    /* while */
  290.  
  291.  
  292.             }
  293.           else
  294.             {
  295.               printf ("Fehler bei Gadget-Creation. \n");
  296.             }
  297.         }        /* do */
  298.           while (going);    /* neuzeichnen, wenn Going = True */
  299.  
  300.           CloseWindow (win);
  301.           win = NULL;
  302.           if (glist)
  303.         FreeGadgets (glist);
  304.         }            /* if */
  305.       FreeVisualInfo (vi);
  306.     }            /* getVisualInfo */
  307.     }                /* LockPubScreen */
  308.  
  309.   if (result == NOSELECT)    /* todo, kludge */
  310.     {
  311.       printf ("User Cancel\n");
  312.       result = NOSELECT;
  313.     }                /* todo, kludge */
  314.  
  315.   printf ("Ergebnis Dialog: TO %s  TOA %s  SUBJ %s\n", to, toa, subj);
  316.   return (result);
  317. }
  318.  
  319. /*---------------------------------------------------*/
  320.  
  321. /* ShowReq -- Zeigt kurzen Infotext in einem Requester
  322.  
  323. Ist soweit gebrauchbar.
  324. Die Routine ShowError, siehe unten, ruft ShowReq auf.
  325.  */
  326.  
  327. /* return NULL = Abbruch, Cancel */
  328.  
  329. int
  330. ShowReq (STRPTR title, STRPTR text, STRPTR gads)
  331. {
  332.   struct EasyStruct myES =
  333.   {
  334.     sizeof (struct EasyStruct),
  335.     0,
  336.     title ? title : NB_NAME " Meldung",        /* Default-Texte festlegen *//*todo: lokalisieren */
  337.     text ? text : "Unterbrechung!",    /*todo: lokalisieren */
  338.     gads ? gads : "Weiter",    /*todo: lokalisieren */
  339.   };
  340.  
  341.   return (EasyRequest (0, &myES, NULL));
  342.  
  343. /* zu EasyRequest: */
  344. /* 1. Paramaeter: Window -- hier NULL, da Requester auf Defaultscreen erscheinen soll */
  345. /* 2. Parameter: &myES -- Zeiger auf oben definierte EasyStruct */
  346. /* 3. Parameter: IDCMP-Flags (z.B. DISKINSERTED) -- hier NULL, da unnötig */
  347. }
  348.  
  349. int
  350. ShowError (STRPTR error)
  351. {
  352.   return (ShowReq (NB_NAME " Hinweis", error, NULL));
  353. }
  354.